package com.witsight.platform.util.lang;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.TimeZone;

import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.util.Assert;

/**   
 * 说明：方便日期操作的工具类，所有对日期的操作必须调用此方法。 
 * @Title: DateUtil.java 
 * @Package com.witsight.platform.util.lang 
 * @See: {@link DateUtils}
 * Copyright: Copyright (c) 2017
 * Company:sany huax witsight team by product
 * @author: penght  
 * @date: 2017年9月11日 下午2:56:10 
 * @version: V1.0
 *
 */
public abstract class DateUtil extends DateUtils {
	/**
	 * 说明：定义后能再同一类中使用static常量log
	 */
	private static final Logger log = LoggerFactory.getLogger(DateUtil.class);
	// yyyy-MM-dd'T'HH:mm:ssZZ
	public static String DATETIME_TIME_ZONE_FORMAT = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.getPattern();
	public static final String BUNDLE_KEY = "i18n/messages";
	/**
	 * 说明：声明String常量FULL_DATE
	 */
	public static final String FULL_DATE = "yyyy-MM-dd HH:mm:ss";
	
	/**
	 * 说明：声明String常量CODERULE_LONG_DATE_OTHER
	 */
	public static final String CODERULE_LONG_DATE_OTHER = "yyyy-MM-dd";
	
	/**
	 * 说明：声明String常量CODERULE_LONG_DATE
	 */
	public static final String CODERULE_LONG_DATE = "yyyyMMdd";
	
	/**
	 * 说明：声明String常量SERVERORDER_DATE
	 */
	public static final String SERVERORDER_DATE = "yyyyMMdd HH:mm:ss";
	
	/**
	 * 说明：声明String常量CODERULE_SHORT_DATE
	 */
	public static final String CODERULE_SHORT_DATE = "MM-dd";
	
	/**
	 * 说明：声明String常量CODERULE_LONG_DATE_FM
	 */
	public static final String CODERULE_LONG_DATE_FM = "yyyy-MM-dd";
	
	public static final String CODERULE_LONG_DATE_UTC = "yyyy-MM-dd'T'HH:mm:ss.SSS Z";
	
	/**
	 * 说明：声明String常量CODERULE_LONG_DATE_MIN
	 */
	public static final String CODERULE_LONG_DATE_MIN = "HH:mm";
	
	/**
	 * 说明：声明String常量CODERULE_SHORT_DATE
	 */
	public static final String CODERULE_SHORT_MONTH = "yyyy-MM";
	/**
	 * 说明：声明String常量GMT_8 timezone
	 */
	public static final String GMT_8 = "GMT+08:00";
	/**
	 * 说明：UTC timezone
	 */
	public static final String UTC = "UTC";
	
	/**
	 * 说明：声明String常量DATE_FORMAT_YYMMDD = 'yyMMdd'
	 */
	public static final String DATE_FORMAT_YYMMDD = "yyMMdd";
	
	/**
	 * 说明：声明String常量CODERULE_LONGNNUMBER_DATE ： yyyyMMddHHmmss
	 */
	public static final String CODERULE_LONGNNUMBER_DATE = "yyyyMMddHHmmss";
	
	/**
	 * 说明：一天的毫秒 1000 * 60 * 60 * 24
	 */
	public static final Integer DAY_MILLISECOND = 1000 * 60 * 60 * 24;
	
	/**
	 * 说明：声明String常量 yyyyMM
	 */
	public static final String CODERULE_LONG_DATE_MONTH = "yyyyMM";
	
	/**
	 * 说明：根据参数传入的格式取得Date对象
	 * @Title: getDate
	 * @See: {@link #getDate(String, String)}
	 * @author tangheng
	 * @param stringDate 数据库中的日期作为字符串
	 * @param DateFormat  转换的日期格式
	 * @return 转换后的日期
	 * @date: 2015年4月27日 下午7:21:17
	 */
	public static Date getDate(String stringDate, String format) {
		SimpleDateFormat df;
		Date returnValue = null;

		if (stringDate != null) {
			df = new SimpleDateFormat(format);
			df.setTimeZone(LocaleContextHolder.getTimeZone());
			try {
				returnValue = df.parse(stringDate);
			} catch (ParseException e) {
				if (log.isWarnEnabled()) {
					log.warn("{} parse {} has exception." , stringDate, format);
				}
			}
		}
		return returnValue;
	}
	
	/**
	 * 说明：根据参数传入的格式取得Date对象
	 * @Title: getDate
	 * @See: {@link #getDate(String, String)}
	 * @author tangheng
	 * @param stringDate 数据库中的日期作为字符串
	 * @param DateFormat  转换的日期格式
	 * @return 转换后的日期
	 * @date: 2015年4月27日 下午7:21:17
	 */
	public static Date getDate(String stringDate, String format,Locale locale) {
		SimpleDateFormat df;
		Date returnValue = null;

		if (stringDate != null) {
			df = new SimpleDateFormat(format,locale);
			try {
				returnValue = df.parse(stringDate);
			} catch (ParseException e) {
				if (log.isWarnEnabled()) {
					log.warn("{} parse {} has exception." , stringDate, format);
				}
			}
		}
		return returnValue;
	}
	/**
	 * 说明：转换一个Oracle格式的日期dd-MMM-yyyy--》mm/dd/yyyy这一方法的尝试
	 * @Title: getDate
	 * @See:
	 * @author tangheng
	 * @param aDate   对象日期
	 * @param DateFormat   转换日期格式
	 * @return 转换后的日期格式
	 * @date: 2015年4月27日 下午7:24:50
	 */
	public static String getDate(Date aDate, String DateFormat) {
		SimpleDateFormat df;
		String returnValue = "";

		if (aDate != null) {
			df = new SimpleDateFormat(DateFormat);
			df.setTimeZone(LocaleContextHolder.getTimeZone());
			returnValue = df.format(aDate);
		}
		return (returnValue);
	}
	/**
	 * 
	 * 说明：获取当前时间的UTC字符串
	 * @Title: GetUtcNowStr
	 * @See: []
	 * @author penght
	 * @return 
	 * @date: 2018年3月29日 下午4:01:02
	 */
	public static String GetUtcNowStr(String DateFormat) {
		Date date = new Date();
		SimpleDateFormat df=new SimpleDateFormat(DateFormat);
		df.setTimeZone(TimeZone.getTimeZone(UTC));
		return df.format(date);
	}
	/**
	 * 
	 * 说明：获取参数时间的UTC字符串
	 * @Title: GetUtcNowStr
	 * @See: []
	 * @author penght
	 * @return 
	 * @date: 2018年3月29日 下午4:01:02
	 */
	public static String GetUtcStr(Date date,String DateFormat) {
		SimpleDateFormat df=new SimpleDateFormat(DateFormat);
		df.setTimeZone(TimeZone.getTimeZone(UTC));
		return df.format(date);
	}
	/**
	 * 说明：long time change Date
	 * @Title: getDate
	 * @See: {@link #getDate(Long)}
	 * @author penght
	 * @param time 时间lang
	 * @return 日期
	 * @date: 2017年10月10日 下午3:45:46
	 */
	public static Date getDate(Long time) {
		if (time == null || time < 1) {
			return null;
		}
		return new Date(time);
	}
	
	/** 
	 * 说明：根据Second偏移量获取日期
	 * @Title: getSecondsOffsetDate
	 * @See: {@link #getSecondsOffsetDate(int)}
	 * @author wangt67
	 * @param seconds
	 * @return Date
	 * @date: 2017年11月6日 下午2:27:35
	 */
	public static Date getSecondsOffsetDate(int seconds){
		Date dateNow = getNowDatetime();
		return addSeconds(dateNow, seconds);
	}
	/** 
	 * 说明：根据Second偏移量获取日期
	 * @Title: getSecondsOffsetDate
	 * @See: {@link #getSecondsOffsetDate(int)}
	 * @author wangt67
	 * @param seconds
	 * @return Date
	 * @date: 2017年11月6日 下午2:27:35
	 */
	public static String getSecondsOffsetDateStr(int seconds){
		Date resultDate = getSecondsOffsetDate(seconds);
		return convertDateToStr(resultDate);
	}
	
	
	/**
	 * 
	 * 说明：获取系统当前时间(推荐使用)
	 * @Title: getNowDatetime
	 * @See: []
	 * @author penght
	 * @return 
	 * @date: 2018年3月14日 下午5:39:41
	 */
	public static Date getNowDatetime() {
		return getNowDate();
	}
	
	
	public static String getDateTimePattern() {
		return DateUtil.getDatePattern() + " HH:mm:ss";
	}
	
	/** 
	 * 说明：获取日期格式MM/dd/yyyy
	 * @Title: getDatePattern
	 * @See: {@link #getDatePattern()}
	 * @author wangt67
	 * @return 日期格式
	 * @date: 2017年11月6日 下午2:36:56
	 */
	public static String getDatePattern() {
		Locale locale = LocaleContextHolder.getLocale();
		String defaultDatePattern = null;
		try {
			defaultDatePattern = ResourceBundle.getBundle(BUNDLE_KEY, locale).getString(
					"commonForm.date.format");
		} catch (MissingResourceException mse) {
			defaultDatePattern = FULL_DATE;
		}
		return defaultDatePattern;
	}
	
	/** 
	 * 说明：将日期字符串按指定格式转换成日期类型例如：
	 * "MM/dd/yyyy 05/06/2015"转换成Wed May 06 00:00:00 CST 2015
	 * @Title: convertStringToDate
	 * @See: {@link #convertStringToDate(String, String)}
	 * @author wangt67
	 * @param aMask MM/dd/yyyy
	 * @param strDate 待转换的日期字符串
	 * @return 指定格式转换成的日期类型
	 * @throws ParseException ParseException 解析异常
	 * @date: 2017年11月6日 下午2:32:31
	 */
	@Deprecated
	public static Date convertStringToDate(String aMask, String strDate) throws ParseException {
		SimpleDateFormat df;
		Date date;
		df = new SimpleDateFormat(aMask);
		df.setTimeZone(LocaleContextHolder.getTimeZone());
		try {
			date = df.parse(strDate);
		} catch (ParseException pe) {
			throw new ParseException(pe.getMessage(), pe.getErrorOffset());
		}
		return (date);
	}
	/**
	 * 
	 * 说明：将日期转换成8时区的字符串
	 * @Title: getGmt8Date
	 * @See: {@link getGmt8Date}
	 * @author penght
	 * @param aDate 日期对象
	 * @param DateFormat 格式化字符串
	 * @return 日期字符串
	 * @date: 2018年5月18日 下午1:47:40
	 */
	public static String getGmt8Date(Date aDate, String DateFormat) {
		SimpleDateFormat df;
		String returnValue = "";

		if (aDate != null) {
			df = new SimpleDateFormat(DateFormat);
			df.setTimeZone(TimeZone.getTimeZone(GMT_8));
			returnValue = df.format(aDate);
		}
		return (returnValue);
	}
	/**
	 * 
	 * 说明：将给定的时间字符串按照给定的时区转换成date对象
	 * @Title: getDate
	 * @See: {@link #getDate(String, String, TimeZone)}
	 * @author penght
	 * @param strFormat 格式化字符串
	 * @param strDate 日期字符串
	 * @param timeZone 时区对象
	 * @return 转换成功的日期
	 * @date: 2018年5月18日 下午1:35:52
	 */
	public static Date getDate(String strFormat, String strDate,TimeZone timeZone) {
		Date date = null;
		if (StringUtil.isEmpty(strDate)) {
			return null;
		}
		if(ObjectUtil.isEmpty(timeZone)) {
			return null;
		}
		SimpleDateFormat df = new SimpleDateFormat(strFormat);
		df.setTimeZone(timeZone);
		try {
			date = df.parse(strDate);
		} catch (ParseException pe) {
			
		}
		return (date);
	}
	
	/**
	 * 说明：根据给定字符串日期转成日期类型的格式 时间清零如：12/09/2090---〉Sat Dec 09 00:00:00 CST 2090
	 * @Title: convertStringToDate
	 * @See:
	 * @author wangt67
	 * @param strDate 给定字符串日期 (in format 12/09/2090)
	 * @return date object
	 * @throws ParseException 解析异常
	 * @date: 2017年11月6日 下午2:33:51
	 */
	@Deprecated
	public static Date convertStringToDate(final String strDate) throws ParseException {
		return convertStringToDate(getDatePattern(), strDate);
	}
	
	/** 
	 * 说明：根据Date转换成String  yyyy-MM-dd HH:mm:ss
	 * @Title: convertDateToStr
	 * @See: {@link #convertDateToStr(Date)}
	 * @author wangt67
	 * @param strDate
	 * @return String
	 * @throws ParseException 
	 * @date: 2017年12月25日 下午5:27:52
	 */
	public static String convertDateToStr(final Date strDate){
		SimpleDateFormat df;
		String date;
		df = new SimpleDateFormat(FULL_DATE);
		df.setTimeZone(LocaleContextHolder.getTimeZone());
		date = df.format(strDate);
		return date;
	}
	/** 
	 * 说明：获取本月第一天的日期
	 * @Title: getDateOfFirstMonth
	 * @See: []
	 * @author wangt67
	 * @param date
	 * @return 
	 * @date: 2017年11月10日 上午10:45:30
	 */
	@Deprecated
	public static Date getDateOfFirstMonth(Date date) {
		if (date == null) {
			date = getMinDate(getNowDate());
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		return calendar.getTime();
	}

	/** 
	 * 说明：获取本月最后一天日期
	 * @Title: getDateOfLastMonth
	 * @See: []
	 * @author wangt67
	 * @param date
	 * @return 
	 * @date: 2017年11月10日 上午10:45:21
	 */
	@Deprecated
	public static Date getDateOfLastMonth(Date date) {
		if (date == null) {
			date = getMaxDate(getNowDate());
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
		return calendar.getTime();
	}

	/** 
	 * 说明：取得现在的时间
	 * @Title: getNowDate
	 * @See: []
	 * @author wangt67
	 * @return 
	 * @date: 2017年11月10日 上午10:45:13
	 */
	public static Date getNowDate() {
		return getDateByNow(0);
	}
	
	/** 
	 * 说明：获取当天凌晨时间Wed May 06 00:00:00 CST 2015
	 * @Title: getDateByNow
	 * @See: []
	 * @author wangt67->lianwq
	 * @param day
	 * @return 
	 * @date: 2017年11月10日 上午10:45:05 -> 2018年03月26日 下午15:32:05
	 */
	public static Date getDateByNow(int day) {
	
		Date today = new Date();
		try {
			today = getToday(day).getTime();
		} catch (Exception e) {
		}
		return today;
	}
	
	/** 
	 * 说明：获取当前时间的Calendar日历对象
	 * @Title: getToday
	 * @See: []
	 * @author wangt67
	 * @param day
	 * @return
	 * @throws ParseException 
	 * @date: 2017年11月10日 上午10:44:55
	 */
	public static Calendar getToday(int day) throws ParseException {
		Date today = new Date();
		SimpleDateFormat df = new SimpleDateFormat(getDatePattern());
		String todayAsString = df.format(today);
		Calendar cal = new GregorianCalendar();
		cal.setTime(convertStringToDate(todayAsString));
		cal.add(Calendar.DATE, day);
		return cal;
	}
	
	/** 
	 * 说明：获取当天最大时间例如：Wed May 06 23:59:59 CST 2015
	 * @Title: getMaxDate
	 * @See: {@link #getMaxDate(Date)}
	 * @author wangt67
	 * @param aDate
	 * @return Date
	 * @date: 2017年11月10日 上午10:44:21
	 */
	public static Date getMaxDate(Date aDate) {
		if (aDate == null || !(aDate instanceof Date)) {
			return null;
		}
		Calendar cal = Calendar.getInstance();
		cal.setTime(aDate);
		cal.set(Calendar.HOUR_OF_DAY, 23);
		cal.set(Calendar.MINUTE, 59);
		cal.set(Calendar.SECOND, 59);
		Date d2 = cal.getTime();
		return getDateUTC(d2);
	}
	
	/** 
	 * 说明：获取当天最小时间例：Wed May 06 00:00:00 CST 2015
	 * @Title: getMinDate
	 * @See: {@link #getMinDate(Date)}
	 * @author wangt67
	 * @param aDate
	 * @return Date
	 * @date: 2017年11月10日 上午10:43:51
	 */
	public static Date getMinDate(Date aDate) {
		if (aDate == null || !(aDate instanceof Date)) {
			return null;
		}
		Calendar cal = Calendar.getInstance();
		cal.setTime(aDate);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		Date d2 = cal.getTime();
		return getDateUTC(d2);
	}
	/** 
	 * 说明：获取当天最小时间例：Wed May 06 00:00:00 CST 2015
	 * @Title: getMinDate
	 * @See: {@link #getMinDate(Date)}
	 * @author yangbin
	 * @param aDate
	 * @return Date
	 * @date: 2017年11月10日 上午10:43:51
	 */
	
	public static Date getUTCMinDate(Date aDate) {
		if (aDate == null || !(aDate instanceof Date)) {
			return null;
		}
		Calendar cal = Calendar.getInstance();
		cal.setTime(aDate);
		cal.setTimeZone(TimeZone.getTimeZone("UTC"));
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		Date d2 = cal.getTime();
		return d2;
	}
	/**
	 * 
	 * 说明：将给定时间转成utc时间
	 * @Title: getDateUTC
	 * @See: {@link #getDateUTC}
	 * @author penght
	 * @param aDate
	 * @return 
	 * @date: 2018年5月8日 上午10:42:54
	 */
	public static Date getDateUTC(Date aDate) {
		if (aDate == null || !(aDate instanceof Date)) {
			return null;
		}
		Calendar cal = Calendar.getInstance();
		cal.setTime(aDate);
		cal.setTimeZone(TimeZone.getTimeZone("UTC"));
		Date d2 = cal.getTime();
		return d2;
	}
	/**
	 * 
	 * 说明：根据Date是否不为空
	 * 
	 * @Title: isNotEmpty
	 * @See: {@link #isNotEmpty(Date date)}
	 * @author lianwq
	 * @param isNotEmpty
	 * @return boolean
	 * @date: 2016年10月12日 上午8:28:15
	 */
	public static boolean isNotEmpty(Date date) {
		if(date!=null){
			return true;
		}
		return false;
	}
	
	/** 
	 * 说明：获取当天日期 :2017-12-07
	 * @Title: getNowLocalDate
	 * @See: {@link #getNowLocalDate()}
	 * @author wangt67
	 * @return LocalDate
	 * @date: 2017年12月7日 下午4:22:42
	 */
	@Deprecated
	public static LocalDate getNowLocalDate(){
		LocalDate localDate = LocalDate.now();
		return localDate;
	}
	
	/**
	 * 说明：获取年份
	 * @Title: getYearByNow
	 * @See:
	 * @author tangheng
	 * @return 当前年份
	 * @date: 2015年4月28日 上午9:54:55
	 */
	@Deprecated
	public static int getYearByNow() {
		try {
			return DateUtil.getToday(0).get(Calendar.YEAR);
		} catch (ParseException e) {
			e.printStackTrace();
			return 0;
		}
	}
	
	/** 
	 * 说明：根据天数偏移量，获取日期
	 * 当前日期：2017-12-07
	 * 偏移量：   30
	 * 结果：       2017-11-07
	 * @Title: getNowLocalOffsetDate
	 * @See: {@link #getNowLocalOffsetDate(long)}
	 * @author wangt67
	 * @param days
	 * @return LocalDate
	 * @date: 2017年12月7日 下午4:22:45
	 */
	@Deprecated
	public static LocalDate getNowLocalOffsetDate(long days){
		LocalDate localDate = getNowLocalDate();
		return localDate.minusDays(days);
	}
	
	/** 
	 * 说明：获取现在时间分钟（15:10格式）
	 * @Title: getMinute
	 * @See: {@link #getMaxDate(Date)}
	 * @author lianwq
	 * @param object 给定字符串日期 (in format 15:10)
	 * @return String
	 * @date: 2017年12月19日 上午16:47:21
	 */
	public static Integer getMinute(Object object) {
		if (object == null || !(object instanceof String)) {
			return null;
		}
		String[] ret=((String) object).split(":");
		return Integer.parseInt(ret[0])*60+Integer.parseInt(ret[1]);
	}
	
	/**
	 * 说明：计算指定日期是当月第几天
	 * @Title: getDayOfMonth
	 * @See:
	 * @author tangheng
	 * @param date  对象日期
	 * @return 指定日期是当月第几天
	 * @date: 2015年4月28日 上午9:49:05
	 */
	@Deprecated
	public static int getDayOfMonth(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		return cal.get(Calendar.DATE);
	}
	
	/**
	 * 说明：获取当前小时
	 * @Title: getHourByNow
	 * @See:
	 * @author panjun
	 * @return 当前小时
	 * @date: 2017年12月22日 上午9:55:19
	 */
	@Deprecated
	public static int getHourByNow() {
		try {
			return DateUtil.getToday(0).get(Calendar.HOUR_OF_DAY);
		} catch (ParseException e) {
			e.printStackTrace();
			return 0;
		}
	}
	/**
	 * 说明：获取一个月有几周
	 * @Title: getNumByWeek
	 * @See:
	 * @author yangbin
	 * @return 几周 
	 * @date: 2018年3月14日 下午17:55:19
	 */
	public static int getNumByWeek(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.setFirstDayOfWeek(Calendar.MONDAY);
		return cal.getActualMaximum(Calendar.WEEK_OF_MONTH);
	}
	/**
	 * 说明：获取当前时间是这个月的第几周
	 * @Title: getMonthByWeek
	 * @See:
	 * @author yangbin
	 * @return 第几周 
	 * @date: 2018年3月14日 下午17:55:19
	 */
	public static int getMonthByWeek(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.setFirstDayOfWeek(Calendar.MONDAY);
		return cal.get(Calendar.WEEK_OF_MONTH);
	}
	/**
	 * 说明：当前时间减一天
	 * @Title: timeCutOneDay
	 * @See:
	 * @author lianwq
	 * @param Date 时间
	 * @return Date
	 * @date: 2017年12月22日 上午15:09:10
	 */
	public static Date timeCutOneDay() {
		Date beginDate = getNowDate();
		Calendar c = Calendar.getInstance();
		c.setTime(beginDate);
		c.set(Calendar.DATE, c.get(Calendar.DATE) - 1);
		return c.getTime();
	}
	/**
	 * 
	 * 说明：获取某年的第一天
	 * @Title: getCurrYearFirst
	 * @See: {@link #getCurrYearFirst()}
	 * @author luoy45
	 * @param year
	 * @return 
	 * @date: 2017年12月28日 下午5:47:03
	 */
	public static Date getCurrYearFirst(int year){
		Calendar c = Calendar.getInstance();
		c.clear();
		c.set(Calendar.YEAR, year);
		Date currYearFirs = c.getTime();
		return currYearFirs;
	}
	
	
	/** 
	 * 说明：判断当前时间是否为24小时以内的时间
	 * @Title: compareOneDayTime
	 * @See: {@link #compareOneDayTime(String)}
	 * @author wangt
	 * @param date2 日期转换
	 * @return 返回boolean
	 * @date: 2016年12月5日 下午2:57:34
	 */
	public static boolean compareOneDayTime(Date date2){
		if(date2 == null) return false;
		Date date1 = getHoursOffsetDate(-24);
		return date1.before(date2);
	}
	
	/** 
	 * 说明：根据小时偏移量获取日期
	 * @Title: getHoursBeforeDate
	 * @See: {@link #getHoursBeforeDate()}
	 * @author wangt
 	 * @param hours 小时偏移量
	 * @return 日期
	 * @date: 2016年12月5日 下午2:10:00
	 */
	public static Date getHoursOffsetDate(int hours){
		Date dateNow = getNowDatetime();
		return addHours(dateNow, hours);
	}
	
	/** 
	 * 说明：根据小时偏移量获取日期
	 * @Title: getHoursBeforeDate
	 * @See: {@link #getHoursBeforeDate()}
	 * @author wmq
 	 * @param hours 小时偏移量
	 * @return 日期
	 * @date: 2016年12月5日 下午2:10:00
	 */
	public static Date getHoursOffsetDate(Date date,int hours){
		return addHours(date, hours);
	}
	/** 
	 * 说明：根据月偏移量获取日期
	 * @Title: getHoursBeforeDate
	 * @See: {@link #getHoursBeforeDate()}
	 * @author wmq
 	 * @param months 小时偏移量
	 * @return 日期
	 * @date: 2018年1月7日 下午2:10:00
	 */
	public static Date getMonthOffsetDate(Date date,int months){
		return addMonths(date, months);
	}
	
	/** 
	 * 说明：根据日偏移量获取日期
	 * @Title: getDayOffsetDate
	 * @See: {@link #getHoursBeforeDate()}
	 * @author wmq
 	 * @param days 小时偏移量
	 * @return 日期
	 * @date: 2018年1月7日 下午2:10:00
	 */
	public static Date getDayOffsetDate(Date date,int days){
		return addDays(date, days);
	}
	
	/** 
	 * 说明：比较两个日期大小
	 * @Title: compareDateTime
	 * @See: {@link #compareDateTime(Date, Date)}
	 * @author wangt
	 * @param date1 日期比较参数1
	 * @param date2 日期比较参数2 
	 * @return true:date1>date2
	 * @date: 2016年12月5日 下午2:41:29
	 */
	public static boolean compareDateTime(Date date1, Date date2){
		if(date1 == null || date2 == null){
			return false;
		}
		 return date1.before(date2);
	}
	/** 
	 * 说明：是否在12小时之内（15:10格式）
	 * @Title: isHalf
	 * @See: {@link #isHalf(Object)}
	 * @author lianwq
	 * @param object 给定字符串日期 (in format 15:10)
	 * @return true
	 * @date: 2018年01月31日 上午17:37:21
	 */
	public static boolean isHalf(Object object) {
		if (object == null || !(object instanceof String)) {
			return false;
		}
		String[] ret=((String) object).split(":");
		if(Integer.parseInt(ret[0])<12){
		return true;
		}
		return false;
	}
	
	
	/** 
	 * 说明：根据两个日期之间的豪秒数
	 * @Title: getOffsetOfTowData
	 * @See: {@link #getDayOffsetDate()}
	 * @param startDate 开始时间
	 * @param endDate 结束时间
	 * @author wmq
	 * @return 两个日期之间的毫秒数
	 * @date: 2018年2月6日 下午5:10:00
	 */
	public static Long getOffsetOfTowData(Date startDate,Date endDate){
		return endDate.getTime() - startDate.getTime();
	}
	
	/**
	 * 
	 * 说明：根据分钟偏移量获取日期
	 * @Title: getMinutesOffsetDate
	 * @See: {@link #getMinutesOffsetDate()}
	 * @author yangbin
	 * @param date 时间
	 * @param minutes 分钟偏移量
	 * @return 日期
	 * @date: 2018年5月14日 下午3:27:45
	 */
	public static Date getMinutesOffsetDate(Date date,int minutes){
		return addMinutes(date, minutes);
	}
	
	/**
	 * 说明：根据参数传入的格式取得Date对象
	 * @Title: getDate
	 * @See: {@link #getDate(String, String)}
	 * @author tangheng
	 * @param stringDate 数据库中的日期作为字符串
	 * @param DateFormat  转换的日期格式
	 * @return 转换后的日期
	 * @date: 2015年4月27日 下午7:21:17
	 */
	public static Date getGMTDate(String stringDate, String format) {
		SimpleDateFormat df;
		Date returnValue = null;

		if (stringDate != null) {
			df = new SimpleDateFormat(format);
			df.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
			try {
				returnValue = df.parse(stringDate);
			} catch (ParseException e) {
				if (log.isWarnEnabled()) {
					log.warn("{} parse {} has exception." , stringDate, format);
				}
			}
		}
		return returnValue;
	}

	/**
	 * 说明：转换一个Oracle格式的日期dd-MMM-yyyy--》mm/dd/yyyy这一方法的尝试，日期格式以GMT+08:00时区为准
	 * @Title: getGmtDate
	 * @See:
	 * @author wumingqian
	 * @param aDate   对象日期
	 * @param DateFormat   转换日期格式
	 * @return 转换后的日期格式
	 * @date: 2015年4月27日 下午7:24:50
	 */
	public static String getGmtDate(Date aDate, String DateFormat) {
		SimpleDateFormat df;
		String returnValue = "";

		if (aDate != null) {
			df = new SimpleDateFormat(DateFormat);
			df.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
			returnValue = df.format(aDate);
		}
		return (returnValue);
	}
	
	/** 
	 * 说明：根据年偏移量获取日期
	 * @Title: getYearsOffsetDate
	 * @See: {@link #getYearsOffsetDate()}
	 * @author panjun
	 * @param date 时间
 	 * @param years 年偏移量
	 * @return Date 日期
	 * @date: 2018年1月7日 下午2:10:00
	 */
	public static Date getYearsOffsetDate(Date date, int years){
		return addYears(date, years);
	}
	
	
	/** 
	 * 说明：获取本月第一天的日期
	 * @Title: getUTCDateOfFirstMonth
	 * @See: []
	 * @author wumingqian
	 * @param date
	 * @return 
	 * @date: 2018年06月7日 上午10:45:21
	 */
	public static Date getUTCDateOfFirstMonth(Date date) {
		if (date == null) {
			date = getMinDate(getNowDate());
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
		return calendar.getTime();
	}

	/** 
	 * 说明：获取本月最后一天日期
	 * @Title: getUTCDateOfLastMonth
	 * @See: []
	 * @author wumingqian
	 * @param date
	 * @return 
	 * @date: 2018年06月7日 上午10:45:21
	 */
	public static Date getUTCDateOfLastMonth(Date date) {
		if (date == null) {
			date = getMaxDate(getNowDate());
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
		calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
		return calendar.getTime();
	}
	
	/**
	 * 
	 * 说明：根据指定的年份和月份偏移量获取过去的日期
	 * @Title: getPastYearMonth
	 * @See: {@link #getPastYearMonth(Integer, Integer)}
	 * @author dingt5
	 * @param offsetYear 年份偏移量
	 * @param offsetMonth 月份偏移量
	 * @return 4位年+2位月 201806
	 * @throws ParseException 格式解析异常
	 * @date: 2018年6月6日 上午9:31:16
	 */
	public static Integer getPastYearMonth(Integer offsetYear,Integer offsetMonth){
		Assert.notNull(offsetYear,"offsetYear is null");
		Assert.notNull(offsetMonth,"offsetMonth is null");
		Date beginDate = getNowDate();
		Calendar currentDate = Calendar.getInstance();
		currentDate.setTime(beginDate);
		Integer result = 0;
		//Calendar月份是从0开始的,所有要+1
		result = (currentDate.get(Calendar.YEAR) + offsetYear) * 100 + ((currentDate.get(Calendar.MONTH) + 1) + offsetMonth);
		return result;
	}
	/**
	 * 
	 * 说明：比较结束时间是否比开始时间大 一定数值的秒数
	 * @Title: compareTwoDate
	 * @See: []
	 * @author wumingqian
	 * @param start 开始时间
	 * @param end 结束时间
	 * @param seconds 秒数
	 * @return 
	 * @date: 2018年6月11日 下午1:11:55
	 */
	public static Boolean compareTwoDate(Date start,Date end,Integer seconds)
	{
		Assert.notNull(start,"start is null");
		Assert.notNull(end,"end is null");
		Assert.notNull(seconds,"seconds is null");
		if (DateUtil.getOffsetOfTowData(start, end) > seconds * 1000) {
			return true;
		} else {
			return false;
		}
	}
	
	/**
	 * 
	 * 说明：比较两个时间是否是相同的
	 * @Title: compareSameDate
	 * @See: {@link #compareSameDate}
	 * @author panjun
	 * @param date1 日期
	 * @param date2 日期
	 * @param DateFormat 格式化
	 * @return 
	 * @date: 2018年6月15日 下午4:39:23
	 */
	public static Boolean compareSameDate(Date date1, Date date2, String dateFormat) {
		Assert.notNull(date1, "date1 is null");
		Assert.notNull(date2, "date2 is null");
		Assert.notNull(dateFormat, "dateFormat is null");
		// 时间格式化
		String date1Str = getDate(date1, dateFormat);
		String date2Str = getDate(date2, dateFormat);
		// 比较时间是否相等
		if (StringUtil.equals(date1Str, date2Str)) {
			return true;
		} else {
			return false;
		}
	}
}
